package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.chat.pojo.dto.AiChatDTO;
import com.zenithmind.chat.pojo.dto.AiChatMessageDTO;
import com.zenithmind.chat.pojo.entity.AiChat;
import com.zenithmind.chat.pojo.entity.AiChatMessage;
import com.zenithmind.chat.pojo.query.AiChatPageQuery;
import com.zenithmind.chat.pojo.vo.AiChatVO;
import com.zenithmind.chat.temp.PageResult;

import java.util.List;
import java.util.Map;

/**
 * AI对话服务接口
 */
public interface AiChatService {
    
    /**
     * 创建AI对话
     *
     * @param aiChatDTO 对话信息
     * @return 对话ID
     */
    String createChat(AiChatDTO aiChatDTO);
    
    /**
     * 发送消息
     *
     * @param messageDTO 消息信息
     * @return AI响应消息
     */
    AiChatMessage sendMessage(AiChatMessageDTO messageDTO);
    
    /**
     * 获取对话历史
     *
     * @param chatId 对话ID
     * @return 消息列表
     */
    List<AiChatMessage> getChatHistory(String chatId);
    
    /**
     * 获取对话详情
     *
     * @param chatId 对话ID
     * @return 对话详情
     */
    AiChatVO getChatDetail(String chatId);
    
    /**
     * 删除对话
     *
     * @param chatId 对话ID
     * @return 是否成功
     */
    boolean deleteChat(String chatId);
    
    /**
     * 清空对话历史
     *
     * @param chatId 对话ID
     * @return 是否成功
     */
    boolean clearChatHistory(String chatId);
    
    /**
     * 更新对话标题
     *
     * @param chatId 对话ID
     * @param title 标题
     * @return 是否成功
     */
    boolean updateChatTitle(String chatId, String title);
    
    /**
     * 更新系统提示词
     *
     * @param chatId 对话ID
     * @param systemPrompt 系统提示词
     * @return 是否成功
     */
    boolean updateSystemPrompt(String chatId, String systemPrompt);
    
    /**
     * 分页获取AI对话列表
     * @param page 分页参数
     * @param userId 用户ID
     * @return 对话列表
     */
    Page<AiChatVO> getChatPage(Page<AiChat> page, String userId);
    
    /**
     * 分页获取AI对话列表
     * @param query 查询参数
     * @return 分页数据
     */
    PageResult<AiChatVO> getChatPage(AiChatPageQuery query);
    
    /**
     * 收藏/取消收藏AI对话
     * @param chatId 对话ID
     * @param isFavorite 是否收藏(0-否,1-是)
     * @return 是否成功
     */
    boolean toggleFavorite(String chatId, Integer isFavorite);
    
    /**
     * 设置/取消置顶AI对话
     * @param chatId 对话ID
     * @param isTop 是否置顶(0-否,1-是)
     * @return 是否成功
     */
    boolean toggleTop(String chatId, Integer isTop);
    
    /**
     * 更新AI对话标签
     * @param chatId 对话ID
     * @param tags 标签列表
     * @return 是否成功
     */
    boolean updateChatTags(String chatId, List<String> tags);
    
    /**
     * 更新AI对话共享设置
     * @param chatId 对话ID
     * @param shareType 共享类型
     * @param sharedUserIds 共享用户ID列表
     * @return 是否成功
     */
    boolean updateShareSettings(String chatId, Integer shareType, List<String> sharedUserIds);

    /**
     * 新增或更新AI对话
     * @param aiChatDTO 对话信息
     * @return 对话ID
     */
    String saveOrUpdateChat(AiChatDTO aiChatDTO);

    /**
     * 发送聊天消息并以流式获取AI响应
     *
     * @param chat 对话信息
     * @param messages 历史消息
     * @param content 当前用户消息内容
     * @param emitter SseEmitter 用于将数据块发送给客户端
     * @return 返回一个可用于后续操作的 AiChatMessage 对象 (例如保存到数据库，但内容可能不完整，需要后续填充)
     */
    AiChatMessage chatStream(AiChat chat, List<AiChatMessage> messages, String content, org.springframework.web.servlet.mvc.method.annotation.SseEmitter emitter);

    /**
     * 发送消息并流式返回响应 (由 Controller 调用)
     * @param messageDTO 消息内容
     * @param emitter SseEmitter 用于发送数据
     * @param userId 当前用户ID
     */
    void sendMessageStream(AiChatMessageDTO messageDTO, org.springframework.web.servlet.mvc.method.annotation.SseEmitter emitter, String userId);
    
    /**
     * 管理平台-获取所有用户的对话分页列表
     *
     * @param query 查询参数
     * @return 分页结果
     */
    PageResult<AiChatVO> getAllChatPage(AiChatPageQuery query);
    
    /**
     * 管理平台-批量删除对话
     *
     * @param ids 对话ID列表
     * @return 是否全部成功
     */
    Boolean batchDeleteChats(List<String> ids);
    
    /**
     * 管理平台-获取对话统计数据
     *
     * @return 统计数据
     */
    Map<String, Object> getChatStats();
    
    /**
     * 管理平台-更新对话状态
     *
     * @param chatId 对话ID
     * @param status 状态（0-禁用，1-启用）
     * @return 是否成功
     */
    Boolean updateChatStatus(String chatId, Integer status);
} 